package com.hb.trade.api.routine.config.aspect;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ReflectUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

/**
 * 公共切面类
 *
 * @author zhaojk
 */
@Slf4j
@Aspect
@Component
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
public class ApiCommonAspect {

    /**
     * 捕获到解密注解的需要执行解密操作
     *
     * @param joinPoint
     * @param rsaDecrypt
     * @return
     */
    @Around(value = "@annotation(rsaDecrypt)", argNames = "joinPoint,rsaDecrypt")
    public Object doAround(ProceedingJoinPoint joinPoint, RsaDecrypt rsaDecrypt) {
        // 获取参数索引
        int paramIndex = rsaDecrypt.paramIndex();
        Object[] args = joinPoint.getArgs();

        Object arg = ArrayUtil.get(args, paramIndex);
        Object proceed;
        try {
            if (arg != null) {
                // 参数修改逻辑 start
                String paramKeyName = rsaDecrypt.paramKeyName();
                Object fieldValue = ReflectUtil.getFieldValue(arg, paramKeyName);

                Object valueChanged = decrypt(fieldValue);

                // 参数修改逻辑 end
                ReflectUtil.setFieldValue(arg, paramKeyName, valueChanged);
            }
            proceed = joinPoint.proceed();
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
        return proceed;
    }

    /**
     * rsa解密逻辑
     *
     * @param secretContent 前端传递的密文数据
     * @return rsa解密后的数据
     */
    public static Object decrypt(Object secretContent) {
        if (secretContent == null) {
            return null;
        }
        // ...解解密逻辑写在这里巴拉巴拉巴拉
        // ...解解密逻辑写在这里巴拉巴拉巴拉
        // ...解解密逻辑写在这里巴拉巴拉巴拉
        // ...解解密逻辑写在这里巴拉巴拉巴拉
        // ...解解密逻辑写在这里巴拉巴拉巴拉
        return secretContent;
    }
}
